package advanced进阶;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * CAS的由来
 * 默认情况下，加锁都是依赖于操作系统的mutex这个互斥锁（内核态代码）
 * 全称Compare and swap 比较并交换
 * java的CAS利用的是unsafe这个类提供的CAS操作
 * unsafe的CAS依赖的是jvm针对不同操作系统实现的Atomic::camping
 *
 * CAS是乐观锁的一种实现
 * 是解决问题的一种方法
 * 先比较在交换，如果内存中的值和期望值一样，就进行交换
 *
 * 原子类：常见的一些原子类Atomic...
 * 自旋锁：也是基于CAS实现的，相当于循环
 *
 * 被volatile修饰的变量，其他线程一定可见，但是不被volatile修饰的变量，不确定什么时候可见
 *
 * CAS省去了加锁解锁的过程，也保证了线程安全，相比操作系统mutex，更加高效一点
 * 在竞争不激烈的情况下，CAS更加搞笑，如果竞争激烈的话，原子类底层的while的循环，CPU就会一直空转
 * CAS没有线程阻塞，比较高效，比synchronized高效一点
 */
public class CAS {
    private static AtomicInteger count = new AtomicInteger(0);
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
            for (int i = 0; i < 5000; i++) {
                count.getAndIncrement();//是一个原子性的操作，相当于count++
            }
        });
        Thread t2 = new Thread(()->{
            for (int i = 0; i < 5000; i++) {
                count.getAndIncrement();//是一个原子性的操作，相当于count++
            }
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}
